/**
 * 作者：
 * 创建时间：2012-6-27 上午11:35:28
 */
package dragon.model.table;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import dragon.core.exception.ExceptionHandler;
import dragon.core.io.FileHandler;
import dragon.core.util.FilePath;
import dragon.core.util.StringUtils;
import dragon.model.base.ModelSort;

/**
 * 数据模型容器
 */
public class TableContainer {

	/**
	 * 数据模型容器对象，用于存储系统中定义的所有数据模型对象<br>
	 * k:数据模型唯一标识符(表名:模式+名称),v:Table
	 */
	private static Map<String, Table> container = new HashMap<String, Table>();

	/**
	 * 加载全部数据模型
	 * 
	 * @throws ExceptionHandler
	 */
	public static void loadAll() throws ExceptionHandler {
		container.clear();// 先清空

		List<File> files = FileHandler.getFiles(FilePath.MODEL_TABLE, 0, true);
		for (File file : files) {
			if (file.isDirectory()) {
				continue;
			}
			load(file.getAbsolutePath());
		}
	}

	/**
	 * 加载指定数据模型
	 * 
	 * @param filePath
	 *            数据模型xml配置文件路径
	 * @return
	 * @throws ExceptionHandler
	 */
	public static Table load(String filePath) throws ExceptionHandler {
		Table table = TableParser.parse(filePath);
		if (table != null) {
			container.put(table.getCode(), table);
		}
		return table;
	}

	/**
	 * 从集合中获取数据模型对象
	 * 
	 * @param code
	 *            数据模型唯一标识符(模式+名称)
	 * @return
	 * @throws ExceptionHandler
	 */
	public static Table get(String code) throws ExceptionHandler {
		if (code == null || StringUtils.isEmpty(code)) {
			return null;
		}
		return container.get(code);
	}

	/**
	 * 返回所有数据模型定义
	 * 
	 * @return
	 */
	public static Table[] getAll() {
		Table[] tables = new Table[container.size()];
		@SuppressWarnings({ "unchecked", "rawtypes" })
		List<Table> list = new ArrayList(container.values());
		Collections.sort(list, new ModelSort());
		list.toArray(tables);
		list = null;
		return tables;
	}

	/**
	 * 返回数据模型个数
	 * 
	 * @return
	 */
	public static int size() {
		return container.size();
	}

	/**
	 * 数据模型加载完成后的后续处理
	 * 
	 * @throws ExceptionHandler
	 */
	public static void afterLoad() throws ExceptionHandler {

	}
}
